#include <stdio.h>
#include <string.h>
#include "algorithm.h"
#include "map.h"

#include "map.c++"
#include "hoistbp.c++"

char* key[10] =
{
  "Zero",
  "One",
  "Two",
  "Three",
  "Four",
  "Five",
  "Six",
  "Seven",
  "Eight",
  "Nine"
};

struct str_less
{
  str_less() {}

  bool operator()(char *const x, char *const y) const
    { return strcmp(x, y) < 0; }
};

void print_elem(map_value_type<char*, int> const& elem)
{
  printf("%s: %i\n", elem.first, elem.second);
}

int main()
{
  multimap<char*, int, str_less> test_multimap;

  int i;

  for(i = 0; i < 10; ++i)
    test_multimap.insert(map_value_type<char*, int>(key[i], i));

  for(i = 0; i < 10; ++i)
    printf("%s: %i\n", key[i], (*test_multimap.find(key[i])).second);

  printf("\n");

  print_elem(*test_multimap.find("Three"));

  multimap<char*, int, str_less> const& const_multimap = test_multimap;
  print_elem(*const_multimap.find("Three"));

  for_each(test_multimap.begin(), test_multimap.end(), print_elem);
  printf("\n");

  for_each(test_multimap.rbegin(), test_multimap.rend(), print_elem);
  printf("\n");

  multimap_iterator<char*, int, str_less> j = test_multimap.end();

  print_elem(*--j);
  printf("\n");

  print_elem(*--j);
  printf("\n");

  print_elem(*--j);
  printf("\n");

  multimap<char*, int, str_less> m2(test_multimap);

  for_each(m2.begin(), m2.end(), print_elem);
  printf("\n");

  printf("test_multimap == m2 %i\n", test_multimap == m2);

  (*m2.find("Zero")).second = 1;
  for_each(m2.begin(), m2.end(), print_elem);
  printf("\n");

  printf("test_multimap == m2 %i\n", test_multimap == m2);
};

